[2025-07-07] SSTI, XXE, XML

🦥 본문

SSTI

  • Server Side Template Injection. Template을 악용하여 Server Side에서 악의적인 해석을 유도

Template

  • 동적 웹 페이지에 사용되는 변수 영역 혹은 틀

    image.png

  • {{}}, {%%}, ${}을 따르며 이는 템플릿 엔진에 따라 상이

    image.png

동작 흐름

  1. 템플릿 엔진이 사용자 입력을 템플릿 문법으로 처리하도록 코드 구성
  2. 악성 사용자가 {%code%}, 을 입력
  3. 서버가 code 또는 expression을 ‘실행’하여서 결과를 HTML로 랜더링
  4. 공격자는 code, expression을 통해 Server Side에서 서버 명령을 수행할 수 있을 뿐 아니라 결과를 받아 Interact도 가능

    → 주로 템플릿 엔진 및 SSTI 공격 확인 차 {{77}} 혹은 {%77%} 등의 payload를 사용. 만약 49가 결과값으로 나온다면, 해당 값을 Syntax로 인식하고 있다는 것.

  • 예시 코드

image.png

→ 호스트에서 ls를 입력하는 코드. 템플릿 문법을 확인하는 게 좋음.

XXE

  • XML eXternal Entity. External Entity를 Server Side에서 출력해 포함시키도락 함

XML

  • eXtensible Markup Language. 데이터를 구조화하고 전송하기 위해 만들어진 언어
  • HTML과 유사하게 생겼지만 데이터 표현 목적에 더 적합하며 태그를 자유롭게 만들 수 있음
  • 기본 구조

    image.png

    • L1 : version은 1이고 내부 값은 UTF-8 인코딩 해석
    • L2 : User라는 객체 안에 name, email이라는 객체가 있고 User.name = 홍길동, User.email = hong….
  • 추가 기능 : DTD(Doc. Type Definition)

    image.png

    • note라는 데이터 타입 안에는 to, from, body가 들어가야 함을 의미
    • to, from, body에 대한 데이터 타입을 PCDATA(Parshed Char Data(사람이 읽을 수 있는 말. 즉 String 값))이라고 정의
  • 추가 기능 : External Entity

    image.png

    • 외부의 파일을 가져올 수 있는 기능
    • data라는 DTD에는 secret이라는 값은 “file:….”을 넣은 변수라는 것을 의미
    • 호출 시에는 앞에는 & 뒤에는 ;을 넣어서 호출

원리

  • 예시

    image.png

    • xxe_payload 부분을 사용자 입력값으로 한다면 취약점 발생. 즉, 사용자가 입력한 값이
      <?xml version="1.0"?>
      <!DOCTYPE data [
        <!ENTITY xxe SYSTEM "file:///etc/passwd">
      ]>
      <data>&xxe;</data>
    

    이어서 원치 않는 파일을 파싱하여 출력하게 됨

    • XML을 처리하는 서비스, Jenkins, SSO Service 취약
    • XML Format의 GPX, KML, OSM(지형, 위치 정보를 다루는 파일 형식) 취약

방어

image.png

parser.setFeature(feature_external_ges, False) 
  • DTD를 막고 내부적으로 선언한 DTD로만 파일 형식 정의
  • 외부 파일을 호출할 수 있는 DTD 비활성화

추가 자료

https://www.igloo.co.kr/security-information/웹-템플릿-엔진-기반의-ssti-취약점-분석/

Categories:

Updated:

Leave a comment